home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
A.C.E. 2
/
ACE CD 2.iso
/
FILES
/
UTILS
/
AMOSPRO5.DMS
/
in.adf
/
Menu_Editor.AMOS
/
Menu_Editor.amosSourceCode
Encoding:
Amiga
Atari
Commodore
DOS
FM Towns/JPY
Macintosh
Macintosh JP
NeXTSTEP
RISC OS/Acorn
Shift JIS
utf-8 (detected)
UTF-8
Wrap
AMOS Source Code
|
1992-09-30
|
40.9 KB
|
1,593 lines
'---------------------------------------------------------------
' AMOS Professional Menu Editor
'
' By Fran�ois Lionet
'
' (c) 1990-1992 Europress Software Ltd.
'---------------------------------------------------------------
Set Buffer 40
VER$="1.30"
Close Editor
'-------------------
' USER SET UP ZONE
'-------------------
' Maximum number of menu items
MXMN=150
' NTSC users set display to 200!
DISPLAY=256 : YHI=40 : YLOW=YHI+DISPLAY-63
' This is the size of the TREE and EDIT screen
TREESY=192
' Change for later versions of AMOS!
VERSION=102
' Menu bank number
NUMBANK=6
Dim DTRY(4),DTRY$(4),JMP$(64),ZIT(64),ITZ(64),ZBASE(64),PAR(20),PAR$(20),SPAR(20),TUNE(10)
Dim MN$(MXMN),DR$(4),OB$(20),OBLOC$(20)
Global PAR(),PAR$(),VERSION
Global MXMN,MN$(),X_DF,Y_DF,D_DF,S_DF,I_DF,B_DF,A_DF,Z_DF
Global TREESY,YHI,YTREE,NTOTAL,NFIRST,NLAST,MN_EMPTY$,MCHG,NCUR,NDR,CUR$,LCUR$,DR$(),OB$(),OBLOC$(),OB$
Global MX,MY,TMX,TMY
' If an accessory, grab the banks
If Command Line$="GRAB"
If Prg Under
Trap Bgrab 1
Trap Bgrab 2
End If
End If
Screen Open 0,640,64,4,Hires : Flash Off : Curs Off
Screen Display 0,,YLOW,,
Palette $0,$77,$EEE,$DD
Wind Save
Screen Open 1,320,TREESY,2,Lowres : Curs Off : Scroll Off
Palette 0,$CCC
Screen Display 1,,YHI,,
Reserve Zone MXMN+4
Limit Mouse 128,YHI To 128+320,40+DISPLAY
Get Fonts
For N=1 To 20 : PAR$(N)=Left$(Font$(N),15)+" "+Mid$(Font$(N),31,2) : Next
X_DF=8 : Y_DF=12 : D_DF=16 : S_DF=22 : I_DF=24 : B_DF=26 : Z_DF=28 : A_DF=Z_DF+16
' 1234567890123456789012345678901234567890123456789
MN_EMPTY$="A 12110- ----------------"+"(LO0,0:IN1,2:IN2,0:SF2:SS0)>Empty<"+Chr$(0)+Chr$(0)+Chr$(0)+Chr$(0)
For N=0 To MXMN : MN$(N)=Chr$(127) : Next
PAR(5)=1 : PAR(6)=2 : PAR(7)=1 : PAR(8)=1 : PAR(9)=0 : PAR(13)=1
CBOB=1 : CICO=1 : CINK1=2 : CINK2=0 : PAR(14)=2 : TXTLEN=80
Goto MN_IN
'---> Title page
MN_SAVEIT:
Pop : Pop
MN_IN:
R_SCREEN$=""
PAGE=1 : Gosub MK_MENU
'---> Hello!
MN_TITLE:
Channel 0 To Screen Display 0
A$=" Let R0="+Str$((DISPLAY)/2-32)+";"
A$=A$+" Let R1=4;"
A$=A$+" Move 0,0-R0,1;"
A$=A$+"L: Move 0,0-R0,R1; Move 0,R0,R1;"
A$=A$+" Let R0=R0/2; Let R1=R1-1; If R1>0 Jump M; Let R1=1;"
A$=A$+"M: Move 0,R0,R1; Move 0,0-R0,R1;"
A$=A$+" If R0>0 Jump L"
Amal 0,A$ : Amal On
ALERT["Version"+VER$,"By Fran�ois Lionet","(c) 1992 Europress Software Ltd."]
Amal Off : Screen Display 0,,YLOW,,
Return
'
'---> Save menu script
MN_SAVE:
If SCCOL=0 : Bell : Return : End If
F$=Fsel$("*.Menu","","Please enter menu's name","Name must end by .MENU!")
If Upper$(Right$(F$,5))=".MENU"
Screen 0 : Wind Open 1,0,0,80,3 : Curs Off : Print : Centre "Saving "+F$
On Error Goto D_ERROR
Open Out 1,F$
Screen 2
Print #1,SCCOL
Print #1,SCRES
Screen 0
For N=0 To MXMN
Print #1,Len(MN$(N))
Print #1,MN$(N);
Next
Close
Wind Close
On Error
MNAME$=F$
Return
End If
Return
'
'---> Load a menu script
MN_LOAD:
F$=Fsel$("*.Menu","","Please enter menu's name","Name must end by .MENU!")
If Upper$(Right$(F$,5))=".MENU"
If SCCOL : Screen Close 2 : SCCOL=0 : End If
Screen 0 : Wind Open 1,0,0,80,3 : Curs Off : Print : Centre "Loading "+F$
On Error Goto D_ERROR
Open In 1,F$
Input #1,SCCOL,SCRES
For N=0 To MXMN
Input #1,L : MN$(N)=Input$(1,L)
Next
Close
Wind Close
On Error
SC_OPEN
MCHG=-1 : SET_CUR[0] : TREE
MNAME$=F$
Goto MN_EDITIT
End If
Return
'
'---> Save menu bank
MN_BANK:
If SCCOL=0 : Bell : Return : End If
F$=Fsel$("*.Abk","","Please enter bank name (.ABK)","Bank number"+Str$(NUMBANK)+"!")
If Upper$(Right$(F$,4))=".ABK"
Screen 0 : Wind Open 1,0,0,80,3 : Curs Off : Print : Centre "Saving "+F$
SET_MN
Menu Calc
Erase NUMBANK : Menu To Bank NUMBANK
On Error Goto D_ERROR
Save F$,NUMBANK
Erase NUMBANK
Menu Del
Screen 0 : Wind Close
End If
Return
'
'---> Quit & grab menu bank
MN_GBNK:
If SCCOL=0 or BGRB=0 : Bell : Return : End If
SET_MN
Menu Calc
Erase NUMBANK : Menu To Bank NUMBANK
Trap Bsend NUMBANK
Trap Bsend 1
Trap Bsend 2
Goto MN_ABORT
'
D_ERROR: Wind Close : ALERT["",">>> DISC ERROR <<<",""] : Resume D_ERR
D_ERR: Close : Erase 6 : Return
'
'---> End
MN_ABORT:
If Dreg(0)=0 : For N=1 To 15 : Erase N : Next : End If
Default : Edit
'
'---> Create a menu
MN_NEW_IT:
Pop : Pop
PAGE=2 : PAR(1)=16 : PAR(2)=0
Gosub MK_MENU
' Go on
NW_GO:
If PAR(1)>16 and PAR(2)=$8000
ALERT["","Hires screens are limited to 16 colours!",""]
Goto MN_NEW_IT
Else
SCRES=PAR(2)
SCCOL=PAR(1)
SC_OPEN
End If
For N=0 To MXMN : MN$(N)=Chr$(127) : Next
MCHG=-1 : SET_CUR[0] : TREE
Goto MN_EDITIT
'
'---> Editing
MN_EDITIT:
If SCCOL=0 : Bell : Return : End If
Pop : Pop
R_SCREEN$="Choose_Item"
PAGE=3 : Gosub MK_MENU
'
'---> Choose an item!
CHOOSE_ITEM:
Screen 1 : Screen To Front 1
TREE
OLDZI=0 : REFLAG=0
Do
Repeat
If Mouse Key=2
TRY_MENU
Screen 1
End If
ZI=Mouse Zone : K=Mouse Key
If ZI<>OLDZI
If OLDZI>0 and OLDZI-1<>NCUR : ACT_ITEM[OLDZI-1,0] : End If
OLDZI=0
If ZI>0 and ZI<=MXMN : ACT_ITEM[ZI-1,1] : OLDZI=ZI : End If
End If
Exit If Scin(X Mouse,Y Mouse)<>1 and OLDZI=0,2
Until K<>0 and ZI<>0
D=0
If ZI<=MXMN
ACT_ITEM[NCUR,0]
SET_CUR[ZI-1]
ACT_ITEM[NCUR,1]
E=0 : Gosub DR_MENU
Screen 1 : ZI=-1
End If
If ZI=MXMN+1 : D=-TREESY : End If
If ZI=MXMN+2 : D=-8*4 : End If
If ZI=MXMN+3 : D=8*4 : End If
If ZI=MXMN+4 : D=TREESY : End If
If D
If D<0
Screen Copy Logic,17,-D,320,TREESY To Logic,17,0
Cls 0,17,TREESY-16+D To 320,TREESY
Else
Screen Copy Logic,17,0,320,TREESY-D To Logic,17,D
Cls 0,17,0 To 320,D
End If
Add YTREE,D
MCHG=1 : TREE
End If
Loop
ACT_ITEM[NCUR,1]
Return
'
'---> Change item flags
'
IT_LNK:
IT_ACT:
IT_IMV:
MK_EMPTY
MN_FLAGS[NCUR]
Return
'
IT_LNE:
IT_MVE:
If NCUR>=0
A$=Left$(LCUR$,Len(LCUR$)-1)+"A"
IT_SEARCH[A$,0]
While Param>=0
MN_FLAGS[Param]
A$=Left$(A$,Len(A$)-1)+Chr$(Asc(Right$(A$,1))+1)
IT_SEARCH[A$,Param+1]
Wend
MK_EMPTY
End If
Return
'
' Erase branch coord
ER_POS:
ZERO_COORD : INFO["All offsets erased!"] : Return
'
'---------------
' Create branch
CR_BRA:
If NCUR>=0
If Len(LCUR$)<4
IT_SEARCH[LCUR$+"A",0]
If Param<0
IT_EMPTY
If Param
Left$(CUR$,4)=LCUR$+"A" : MN$(Param)=CUR$+Mid$(MN_EMPTY$,5)
SET_CUR[Param]
MCHG=-1 : TREE : REFLAG=1
ZERO_COORD
End If
End If
End If
End If
Return
'-------------
' Insert item
IT_INS:
If NCUR>=0
For N=MXMN-1 To NCUR Step -1
MN$(N+1)=MN$(N)
Next
MN$(NCUR)=CUR$+Mid$(MN_EMPTY$,5)
MN_RENUM : SET_CUR[NCUR]
MCHG=-1 : TREE : REFLAG=1
ZERO_COORD
End If
Return
'----------
' Add item
IT_ADD:
If NCUR>=0
A$=Left$(LCUR$,Len(LCUR$)-1)+Chr$(Asc(Right$(LCUR$,1))+1)
IT_SEARCH[A$,0]
If Param<0
IT_EMPTY
If Param
Left$(CUR$,4)=A$ : MN$(Param)=CUR$+Mid$(MN_EMPTY$,5)
SET_CUR[Param]
MCHG=-1 : TREE : REFLAG=1
ZERO_COORD
End If
End If
End If
Return
'-------------
' Delete item
IT_DEL:
If NCUR>=0
IT_SEARCH[LCUR$,0]
While Param>=0 and N<MXMN-1
MN$(Param)=Chr$(127)
IT_SEARCH[LCUR$,Param+1]
Wend
Sort MN$(0) : MN_RENUM
SET_CUR[NCUR]
MCHG=-1 : TREE : REFLAG=1
ZERO_COORD
End If
Return
'
'---> Draw menu
MN_DRAWIT:
If NCUR<0
Bell
Return
End If
R_SCREEN$="Ob_Edit"
X=Free
Pop : Pop
Screen 2 : Screen To Front 2 : Cls 0
XTREE=1 : YTREE=9 : SXTREE=Screen Width/2-XTREE : SYTREE=TREESY-16-YTREE
XOB=Screen Width/2+1 : YOB=9
NDR=PAR
Reserve Zone 65
For C=0 To Screen Colour-1 : DR_COLOUR[C] : Next
CL_TREE : Locate 0,0 : Paper 0 : Pen 1 : Print "Current item:"
SET_INK[CINK1,CINK2]
CL_OB : Locate Screen Width/16,0 : Paper 0 : Pen 1 : Print "Current element:"
CUR_SET
For Y=-200 To YHI Step 16 : Screen Display 2,,Y,, : Wait Vbl : Next
P=A_DF
For N=0 To 3
Q=Instr(MN$(NCUR),Chr$(0),P) : DR$(N)=Mid$(MN$(NCUR),P,Q-P) : P=Q+1
Next
MN$(NCUR)=Left$(MN$(NCUR),A_DF-1)
For N=0 To 20 : OB$(N)="" : Next
P=1 : N=0
Repeat
If Mid$(DR$(NDR),P,1)="("
Q=Instr(DR$(NDR),"(",P+1) : If Q<=P : Q=Len(DR$(NDR))+1 : End If
OB$(N)=Mid$(DR$(NDR),P,Q-P)
If Mid$(OB$(N),2,3)="LOe" : OB$(N)="" : End If
P=Q : Inc N
Else
Inc Q
End If
Until Q>=Len(DR$(NDR))
COB=0
DR_TREE
DR_OB[COB]
BACK_DRAW:
PAR(20)=COB : PAGE=4 : Gosub MK_MENU
'
' Back to edit
BTO_EDIT:
MAKE_MN
Screen 2
For Y=YHI To -Screen Height Step -16 : Screen Display 2,,Y,, : Wait Vbl : Next
Cls 0
Goto MN_EDITIT
'
' In the edit screen
OB_EDIT:
Screen 2 : Screen To Front 2
If PAR(20)<>COB : COB=PAR(20) : DR_OB[COB] : End If
Do
Exit If Scin(X Mouse,Y Mouse)<>2
Z=Mouse Zone
If Z=65
If DR_ROUT$<>"" : Gosub GO_DRAW : End If
Z=0
End If
K=Mouse Key : Y=Y Screen(Y Mouse)
If Z<>0 and K=1
If Z<=Screen Colour
If TREESY-Y>8
SET_INK[Z-1,CINK2]
Else
SET_INK[CINK1,Z-1]
End If
CUR_SET
End If
While Mouse Key : Wend
End If
Loop
Return
'
'---> General drawing routine
GO_DRAW:
Do
Do
SET_PAR
X1=-1
If DXOB=0 and SXOB=0
Repeat
Exit If Mouse Zone<>65,3
DXOB=X Screen(X Mouse)-XTREE : DYOB=Y Screen(Y Mouse)-YTREE
Until Mouse Key=1
End If
FLAG=0 : Gosub DR_ROUT$
If TXTOB$<>""
SXOB=Text Length(TXTOB$)
SYOB=SYFONT
End If
If SXOB=0
Repeat
WT_MOVE[0]
Exit If Mouse Zone<>65,3
X=X Screen(X Mouse)-DXOB-XTREE : Y=Y Screen(Y Mouse)-DYOB-YTREE
If X>=MNX and Y>=MNY
SXOB=X : SYOB=Y
SXOB=Min(SXOB,SXTREE)
SYOB=Min(SYOB,SYTREE)
Gosub DRW_IT
End If
Until Mouse Key=0
If SXOB<0 : DXOB=DXOB+SXOB : SXOB=-SXOB : End If
If SYOB<0 : DYOB=DYOB+SYOB : SYOB=-SYOB : End If
End If
Repeat
If DXOB=X Screen(X Mouse)-XTREE and DYOB=Y Screen(Y Mouse)-YTREE : WT_MOVE[3] : End If
Exit If Mouse Zone<>65,3
If Mouse Key=2
DXOB=0 : SXOB=0
If X1>=0 : Put Block 1 : End If
Exit 2
End If
X=X Screen(X Mouse)-XTREE : Y=Y Screen(Y Mouse)-YTREE
If X+SXOB>0 and Y+SYOB>0
DXOB=X : DYOB=Y : Gosub DRW_IT
End If
Until Mouse Key=1
If NCUR>=0 and SXOB>=MNX and SYOB>=MNY
OB$="("
Gosub ST_ROUT$
X=Free
OB$(COB)=OB$ : DR_OB[COB]
DR_TREE
While Mouse Key : Wend
Else
SXOB=0 : DXOB=0
End If
Loop
Loop
If X1>=0 : Put Block 1 : Del Block 1 : End If
Return
DRW_IT:
If X1>=0 : Put Block 1 : Del Block 1 : End If
X1=XTREE+DXOB : Y1=YTREE+DYOB : X2=X1+SXOB : Y2=Y1+SYOB
If X1>X2 : Swap X1,X2 : End If
If Y1>Y2 : Swap Y1,Y2 : End If
X1=X1 and $FFFFFFF0
X2=(X2+16) and $FFFFFFF0
If Y2+2>=Screen Height : Y2=Screen Height-2 : End If
If X2+16>Screen Width : X2=Screen Width-16 : End If
Get Block 1,X1,Y1,X2-X1+16,Max(Y2-Y1+2,2)
Clip XTREE,YTREE To XTREE+SXTREE-1,YTREE+SYTREE
FLAG=1 : Gosub DR_ROUT$ : Wait 2
Clip
Return
'
ST_FONT:
Pop : Pop
PAGE=5 : Gosub MK_MENU : Goto BACK_DRAW
'
ST_PATP: Inc PAR(15) : PAR(15)=Min(PAR(15),34) : CUR_SET : Return
'
ST_PATM: Dec PAR(15) : M=Min(0,-Length(1)) : PAR(15)=Max(PAR(15),M) : CUR_SET : Return
'
T_SET: CUR_SET : Return
'
G_DROB: Screen 2 : DR_OB[PAR(20)] : Return
'
OB_INS:
If COB<20
For N=19 To PAR(20) Step -1 : OB$(N+1)=OB$(N) : Next
OB$(PAR(20))=""
End If
Screen 2 : DR_OB[PAR(20)]
Return
'
OB_DEL:
If PAR(20)<20
For N=PAR(20) To 19 : OB$(N)=OB$(N+1) : Next
OB$(20)=""
End If
Screen 2 : DR_OB[PAR(20)] : DR_TREE
Return
'
OB_PUS: OB_BLOC$=OB$(PAR(20)) : INFO["Object stored!"] : Return
'
OB_PAS:
If OB_BLOC$=""
INFO[">>> No block! <<<"]
Else
OB$(PAR(20))=OB_BLOC$
Screen 2 : DR_OB[PAR(20)] : DR_TREE
End If
Return
'
MK_BOR:
If NDR<>0
INFO[">>> You must be editing the NORMAL item to do so! <<<"]
Else
Screen 2
DR_TREE
MAKE_MN
P=Instr(DR$(0),"LOe")
If P
DXOB=0 : DYOB=0
Add P,3 : Q=Instr(DR$(0),",",P) : SXOB=Val(Mid$(DR$(0),P,Q-P))-1
P=Q+1 : Q=Instr(DR$(0),")",P) : SYOB=Val(Mid$(DR$(0),P,Q-P))-1
Swap CINK1,CINK2
OB$="(" : Gosub S_BOX : DR$(1)=OB$
Swap CINK1,CINK2
End If
End If
Return
'
MK_INV:
If NDR<>0
INFO[">>> You must be editing the NORMAL item to do so! <<<"]
Else
Screen 2
DR_TREE
MAKE_MN
A$=Mid$(DR$(0),1)
P=0
Do
P=Instr(A$,"IN1,",P+1)
Exit If P=0
Q=Instr(A$,"IN2,",P+1)
If Q<>0 and Q-P<9
A1$=Mid$(A$,P+4,2) : A2$=Mid$(A$,Q+4,2)
Mid$(A$,P+4)=A2$ : Mid$(A$,Q+4)=A1$
End If
Loop
DR$(1)=Mid$(A$,1)
End If
Return
'
TR_PUS:
For N=0 To 20 : OBLOC$(N)=OB$(N) : Next
INFO["Tree stored!"]
Return
'
TR_PAS:
For N=0 To 20 : Exit If OBLOC$(N)<>"" : Next
If N>=20
INFO[">>> No tree stored! <<<"]
Else
For N=0 To 20 : OB$(N)=OBLOC$(N) : Next
Screen 2 : DR_OB[PAR(20)] : DR_TREE
End If
Return
'
LD_BANK:
F$=Fsel$("*.ABK","","Please choose a bank")
If F$<>""
Screen 2 : Load F$
If Length(2) : Get Icon Palette : End If
If Length(1) : Fade 4 To -1 : End If
Screen 2 : DR_OB[PAR(20)] : DR_TREE
Else
ALERT["","",">>> Not done <<<"]
End If
Return
'
DR_LINE: DR_ROUT$="D_LINE" : ST_ROUT$="S_LINE" : MNX=0 : MNY=0
E_DR: TXTOB$="" : DXOB=0 : SXOB=0 : Return
D_LINE: If FLAG : Draw XTREE+DXOB,YTREE+DYOB To XTREE+DXOB+SXOB,YTREE+DYOB+SYOB : End If : Return
S_LINE: S_LOC : S_INK[1,CINK1]
OB$=OB$+"LI"+Mid$(Str$(DXOB+SXOB),2)+","+Mid$(Str$(DYOB+SYOB),2)+")"
Return
'
DR_BOX: DR_ROUT$="D_BOX" : ST_ROUT$="S_BOX" : Goto E_DR
D_BOX: If FLAG : Box XTREE+DXOB,YTREE+DYOB To XTREE+DXOB+SXOB,YTREE+DYOB+SYOB : End If : Return
S_BOX: S_INK[1,CINK1]
OB$=OB$+"LO"+Mid$(Str$(DXOB),2)+","+Mid$(Str$(DYOB),2)+":LI"+Mid$(Str$(DXOB+SXOB),2)+","+Mid$(Str$(DYOB),2)+":"
OB$=OB$+"LO"+Mid$(Str$(DXOB+SXOB),2)+","+Mid$(Str$(DYOB),2)+":LI"+Mid$(Str$(DXOB+SXOB),2)+","+Mid$(Str$(SYOB+DYOB),2)+":"
OB$=OB$+"LO"+Mid$(Str$(DXOB+SXOB),2)+","+Mid$(Str$(DYOB+SYOB),2)+":LI"+Mid$(Str$(DXOB),2)+","+Mid$(Str$(SYOB+DYOB),2)+":"
OB$=OB$+"LO"+Mid$(Str$(DXOB),2)+","+Mid$(Str$(DYOB+SYOB),2)+":LI"+Mid$(Str$(DXOB),2)+","+Mid$(Str$(DYOB),2)+")"
Return
'
DR_BAR: DR_ROUT$="D_BAR" : ST_ROUT$="S_BAR" : MNX=1 : MNY=1 : Goto E_DR
D_BAR:
If FLAG
If SXOB>0 and SYOB>0
If PAR(15)<0 : Ink 63,0 : End If
Bar XTREE+DXOB,YTREE+DYOB To XTREE+DXOB+SXOB,YTREE+DYOB+SYOB
End If
End If
Return
S_BAR:
S_LOC
OB$=OB$+"OU"+Mid$(Str$(PAR(13)),2)+":"
OB$=OB$+"PA"+(Str$(PAR(15))-" ")+":"
If PAR(15)>=0
S_INK[1,CINK1] : S_INK[2,CINK2]
Else
S_INK[1,63] : S_INK[2,0]
End If
S_INK[3,CINK1]
OB$=OB$+"BA"+Mid$(Str$(DXOB+SXOB),2)+","+Mid$(Str$(DYOB+SYOB),2)+")"
Return
'
DR_ELL: DR_ROUT$="D_Ell" : ST_ROUT$="S_ELL" : MNX=2 : MNY=2 : Goto E_DR
D_ELL:
If FLAG
If SXOB/2<>0 and SYOB/2<>0
If PAR(15)<0 : Ink 63,0 : End If
Ellipse XTREE+DXOB+SXOB/2,YTREE+DYOB+SYOB/2,SXOB/2,SYOB/2
End If
End If
Return
S_ELL:
S_INK[1,CINK1]
OB$=OB$+"LO"+Mid$(Str$(DXOB+SXOB/2),2)+","+Mid$(Str$(DYOB+SYOB/2),2)+":"
OB$=OB$+"EL"+Mid$(Str$(SXOB/2),2)+","+Mid$(Str$(SYOB/2),2)+")"
Return
'
ST_TLEN:
Wind Open 1,0,0,80,1
Clear Key : Clear Key : Put Key Str$(TXTLEN) : Input "Please enter maximum length: ";L
Wind Close
If L>0 and L<80
TXTLEN=L
Else
Bell
End If
Return
DR_TEXT:
Wind Open 1,0,0,80,1
Input "Please enter text: ";TXTOB$ : TXTOB$=Left$(TXTOB$,TXTLEN)
Wind Close
If TXTOB$=""
ALERT["","",">>> Not done <<<"]
Else
DR_ROUT$="D_TEXT" : ST_ROUT$="S_TEXT" : DXOB=1 : SXOB=0
End If
Return
D_TEXT:
If FLAG
Text DXOB+XTREE,DYOB+YTREE+Text Base,TXTOB$
Else
SXOB=Text Length(TXTOB$) : SYOB=SYFONT
End If
Return
S_TEXT:
S_LOC : S_INK[1,CINK1] : S_INK[2,CINK2]
OB$=OB$+"SF"+Mid$(Str$(PAR(14)),2)+":"
OB$=OB$+"SS"+(Str$(SFONT)-" ")+")"
OB$=OB$+TXTOB$
Return
'
DR_BOB:
If Length(1)
DR_ROUT$="D_BOB" : ST_ROUT$="S_BOB" : DXOB=1 : SXOB=1
Else
Bell
End If
Return
D_BOB:
If K$<>""
If SC=$4F : Add CBOB,-1,1 To Length(1) : FLAG=-1 : Put Key " " : End If
If SC=$4E : Add CBOB,1,1 To Length(1) : FLAG=-1 : Put Key " " : End If
End If
If CBOB<=Length(1)
If FLAG<=0
A=Sprite Base(CBOB)
If A : SXOB=(Deek(A)+1)*16 : SYOB=Deek(A+2) : HX=Deek(A+4) : HY=Deek(A+6) : End If
End If
If FLAG>0
Paste Bob XTREE+DXOB+HX,YTREE+DYOB+HY,CBOB
End If
End If
Return
S_BOB:
S_LOC
OB$=OB$+"BO"+Mid$(Str$(CBOB),2)+")"
Return
'
DR_ICO:
If Length(2)
DR_ROUT$="D_ICO" : ST_ROUT$="S_ICO" : DXOB=1 : SXOB=1
Else
Bell
End If
Return
D_ICO:
If K$<>""
If SC=$4F : Add CICO,-1,1 To Length(2) : FLAG=-1 : Put Key " " : End If
If SC=$4E : Add CICO,1,1 To Length(2) : FLAG=-1 : Put Key " " : End If
End If
If CICO<=Length(2)
If FLAG<=0
A=Icon Base(CICO)
If A : SXOB=(Deek(A)+1)*16 : SYOB=Deek(A+2) : End If
End If
If FLAG>0
Paste Icon XTREE+DXOB,YTREE+DYOB,CICO
End If
End If
Return
S_ICO:
S_LOC
OB$=OB$+"IC"+Mid$(Str$(CICO),2)+")"
Return
'
' Once again, the graphic menu handling routines.
' Grab them for your programs!
' Handle menu
MK_MENU:
E=1
For N=0 To 63 : JMP$(N)="" : Next
RMK_MENU:
Gosub DR_MENU
NOZ=1 : OLDZ=-1 : REFLAG=0
Do
Repeat
If Mouse Key=2
If PAGE<4
TRY_MENU
Else
MAKE_MN : TRY_MENU2
End If
End If
If Scin(X Mouse,Y Mouse)<>0 and OLDZ<0
If R_SCREEN$<>""
Gosub R_SCREEN$
End If
End If
If REFLAG
E=0 : Goto RMK_MENU
End If
Screen To Front 0 : Screen 0 : Z=Mouse Zone : K=Mouse Key and 1
If Z<>OLDZ
If OLDZ>0 : ACT=-1 : IT=ZIT(OLDZ) : OLDZ=-1 : Gosub DR_ITEM : End If
If Z>0 : OLDZ=Z : ACT=Z : IT=ZIT(Z) : ZNE=ZBASE(IT) : Gosub DR_ITEM : End If
End If
Until Z<>0 and K<>0
If GSB$<>"" : Gosub GSB$ : End If
If JMP$(Z)<>"" : Gosub JMP$(Z) : End If
Screen 0 : ACT=Z : ZNE=ZBASE(IT) : Gosub DR_ITEM
If JMP$<>"" : Gosub JMP$ : End If
If K=1 : Repeat : Until Mouse Key=0 : End If
Loop
'
MN_BACK:
On Error Goto NO_SC1
NO_SC2: On Error
Colour Back 0 : View
Pop : Return
NO_SC1: Resume NO_SC2
' Draw menu page
DR_MENU:
Change Mouse 3
Screen 0 : Paper 1 : Pen 2 : Inverse Off
NOZ=1
X=Free
If E
Clw
Reserve Zone 64 : Reset Zone
NOZ=0
End If
IT=0 : ZNE=1 : ACT=-1 : OLDPAR=-1
Repeat
Inc IT : ZBASE(IT)=ZNE : Gosub DR_ITEM
Until FLAG=False
Change Mouse 1
X=Free
Return
' Draw a menu item
DR_ITEM:
LAB$="L"+(Str$(PAGE)-" ")+"_"+(Str$(IT)-" ")
On Error Goto NO_IT
Restore LAB$ : Read IT$
On Error
M=0 : XX=-1 : JMP$=""
Repeat
NEND=Instr(IT$,"|",M+1)
ENC=0 : LBL$="" : TUNE=0 : RADIO=0 : FL=0 : ZZ=0 : NB=0
Repeat
N=M+1
M=Instr(IT$,",",N) : M2=Instr(IT$,":",N) : If M>M2 : M=0 : End If
If M=0 or(NEND<>0 and M1>NEND) : M=M2 : FL=1 : End If
A$=Upper$(Mid$(IT$,N,1)) : Inc N
If A$="E" : ENC=1 : End If
If A$="L" : Gosub GT_STR : LBL$=A$ : Inc ZZ : End If
If A$="C" : CNT=1 : End If
If A$="X" : Gosub GT_STR : XX=Val(A$) : End If
If A$="Y" : Gosub GT_STR : YY=Val(A$) : End If
If A$=">" : Gosub GT_STR : VMN=Val(A$) : End If
If A$="<" : Gosub GT_STR : VMX=Val(A$) : End If
If A$="+" : Gosub GT_STR : VPL=Val(A$) : End If
If A$="R" : GSB$="RADIO" : Inc ZZ : Gosub GT_STR : RADIO=Val(A$) : End If
If A$="T" : GSB$="TUNE" : Inc ZZ
Gosub GT_STRDOT : TUNE=Val(A$)
Gosub GT_STRDOT : NTUNE=Val(A$)
For TU=1 To NTUNE
Gosub GT_STRDOT
TUNE(TU)=Val(A$)
Next
End If
If A$="V" : Gosub GT_STR : PAR=Val(A$) : End If
If A$="S" : Gosub GT_STR : PAR$=A$ : End If
If A$="Z" : Inc ZZ : End If
If A$="J" : Inc ZZ : Gosub GT_STR : JMP$=A$ : End If
Until FL
If NEND
A$=Mid$(IT$,M+1,NEND-M-1)
Else
A$=Mid$(IT$,M+1)
End If
Gosub DR_WORD
M=NEND
Until NEND=0
FLAG=True
Return
'
DR_WORD:
If XX<0 : XX=40-Len(A$)/2 : End If
Locate XX,YY
'
FST=0
If Left$(A$,1)="&"
Inc FST
F$=Upper$(Mid$(A$,2,1)) : B$=Mid$(A$,3)
' Tune button
If F$="T"
A$=""
For TU=1 To NTUNE
If TUNE(TU)=PAR(TUNE)
PTU1=0
For TUU=1 To TU
PTU1=Instr(B$,"/",PTU1+1)
Next
PTU2=Instr(B$,"/",PTU1+1)
A$=Mid$(B$,PTU1+1,PTU2-PTU1-1)
Exit
End If
Next
End If
' String param
If F$="S" : A$=PAR$(PAR) : End If
' Decimal value
If F$="V"
L=Val(B$)
A$=Str$(PAR(PAR))+" "
If Len(A$)<L+2 : A$=A$+Space$(L+2-Len(A$)) : End If
End If
' Palette
If F$="P"
Gosub GT_VAL
B$=Hex$(V,3) : A$=""
For N=2 To 4 : A$=A$+Mid$(B$,N,1)+" " : Next
End If
' Plus / Moins
If F$="-" : A$=" - " : Inc ZZ : LBL$="ST_MINUS" : End If
If F$="+" : A$=" + " : Inc ZZ : LBL$="ST_PLUS" : End If
End If
'
If A$<>""
X1=X Graphic(XX)-3 : Y1=Y Graphic(YY)-2 : X2=X Graphic(XX+Len(A$))+2 : Y2=Y1+11
'
If ZZ<>0 or NOZ=0 or FST<>0
Inverse Off
If ZZ<>0 and ACT=ZNE : Inverse On : APAR=PAR : End If
If RADIO
If PAR(RADIO)=PAR
Inverse On
End If
End If
Print A$;
If ENC<>0 and NOZ=0 : Ink 3 : Box X1,Y1 To X2,Y2 : End If
End If
If ZZ<>0
If NOZ=0
Set Zone ZNE,X1,Y1 To X2,Y2
ZIT(ZNE)=IT : ITZ(IT)=ZNE
If LBL$<>""
JMP$(ZNE)=LBL$
End If
End If
Inc ZNE
End If
XX=XX+(X2-X1)/8+1
End If
Return
NO_IT: Resume NO_IT2
NO_IT2: FLAG=False
Return
ST_PLUS: Add PAR(PAR),VPL : PAR(PAR)=Min(PAR(PAR),VMX) : Return
ST_MINUS: Add PAR(PAR),-VPL : PAR(PAR)=Max(PAR(PAR),VMN) : Return
GT_VAL: VTYPE$=Left$(A$,1) : ADV=ADATA+Val(Mid$(A$,2)) : Return
GT_STR: A$=Mid$(IT$,N,M-N) : Return
GT_STRDOT:
PD=Instr(IT$,"/",N)
If PD=0 or PD>M : PD=M : End If
A$=Mid$(IT$,N,PD-N)
If PD<M
N=PD+1
Else
PD=M
End If
Return
RADIO: PAR(RADIO)=APAR : Return
TUNE:
For TU=1 To NTUNE
Exit If PAR(TUNE)=TUNE(TU)
Next
Add TU,1,1 To NTUNE
PAR(TUNE)=TUNE(TU)
Return
CH_FONT:
PAR(14)=PAR
Screen 2 : CUR_SET : Screen 0
Return
Procedure SC_OPEN
Shared SCRES,SCCOL
If SCRES=0
Screen Open 2,320,TREESY,SCCOL,Lowres
Else
Screen Open 2,640,TREESY,SCCOL,Hires
End If
Curs Off : Flash Off
Screen Display 2,,-Screen Height,,
CINK1=2 : CINK2=0 : If Screen Colour=2 : CINK1=1 : End If
If Length(2) : Get Icon Palette : End If
If Length(1) : Get Sprite Palette : End If
End Proc
Procedure MAKE_MN
Shared TMX,TMY
DR$(NDR)=""
For N=0 To 20
DR$(NDR)=DR$(NDR)+OB$(N)
Next
If NDR=3
DR$(NDR)=DR$(NDR)+"(LOe0,0)"
Else
DR$(NDR)=DR$(NDR)+"(LOe"+Mid$(Str$(TMX),2)+","+Mid$(Str$(TMY),2)+")"
End If
M$=Left$(MN$(NCUR),A_DF-1)
Mid$(M$,X_DF,8)=Space$(8)
MN$(NCUR)=M$+DR$(0)+Chr$(0)+DR$(1)+Chr$(0)+DR$(2)+Chr$(0)+DR$(3)+Chr$(0)
End Proc
Procedure S_INK[N,V]
OB$=OB$+"IN"+Mid$(Str$(N),2)+","+Right$(Str$(V),2)+":"
End Proc
Procedure S_LOC
Shared DXOB,DYOB
OB$=OB$+"LO"+Mid$(Str$(DXOB),2)+","+Mid$(Str$(DYOB),2)+":"
End Proc
Procedure WT_MOVE[KY]
Shared K$,SC
X=X Mouse : Y=Y Mouse
Do
K$=Inkey$ : SC=Scancode
Exit If K$<>""
Exit If Mouse Key and KY
Exit If X Mouse<>X or Y Mouse<>Y
Loop
End Proc
Procedure INFO[A$]
Screen 0 : Paper 1 : Pen 2
Wind Open 1,0,0,80,1 : Curs Off
Centre A$ : Wait 25
Wind Close
End Proc
Procedure DR_TREE
Shared XTREE,YTREE,SXTREE,SYTREE
MX=0 : MY=0
CL_TREE
Clip XTREE,YTREE To XTREE+SXTREE,YTREE+SYTREE
For N=0 To 20 : OB_DRAW[OB$(N),XTREE,YTREE] : Next
TMX=MX : TMY=MY
Clip
End Proc
Procedure DR_OB[N]
Shared XOB,YOB
CL_OB
Clip XOB,YOB To Screen Width-1,TREESY-32
OB_DRAW[OB$(N),XOB,YOB]
Clip
End Proc
Procedure SET_INK[I1,I2]
Shared CINK1,CINK2
DR_COLOUR[CINK1-1] : DR_COLOUR[CINK1] : DR_COLOUR[CINK1+1]
DR_COLOUR[CINK2-1] : DR_COLOUR[CINK2] : DR_COLOUR[CINK2+1]
CINK1=I1 : CINK2=I2
LC=Screen Width/Screen Colour
Set Text 0 : Set Font 1
I=0 : If I1=0 : I=1 : End If : Ink I,I1 : Text LC*I1+LC/2-5,TREESY-9,"1"
I=0 : If I2=0 : I=1 : End If : Ink I,I2 : Text LC*I2+LC/2-5,TREESY-1,"2"
End Proc
Procedure DR_COLOUR[C]
If C>=0 and C<Screen Colour
Set Paint 0 : Set Pattern 0
LC=Screen Width/Screen Colour
Ink C : Bar C*LC,TREESY-15 To C*LC+LC-1,TREESY
Set Zone C+1,C*LC,TREESY-15 To C*LC+LC,TREESY
End If
End Proc
Procedure CUR_SET
Screen 2
Ink 0,0,0 : Set Pattern 0 : Set Paint 0
Bar Screen Width/2+16,TREESY-31 To Screen Width,TREESY-17
SET_PAR
Clip 0,TREESY-31 To Screen Width,TREESY-16
Gr Writing 0 : Text Screen Width/2+16,TREESY-22,PAR$(PAR(14))
Gr Writing 1 : Clip
If PAR(15)<0 : Ink 63,0,CINK2 : End If
Bar Screen Width/2+1,TREESY-30 To Screen Width/2+15,TREESY-17
End Proc
Procedure SET_PAR
Shared CINK1,CINK2,SYFONT,SFONT
Screen 2
Ink CINK1,CINK2,CINK1
Set Font PAR(14) : SYFONT=Val(Right$(PAR$(PAR(14)),4))
SFONT=0 : For N=0 To 2 : If PAR(10+N) : Bset N,SFONT : End If : Next
Set Text SFONT
Set Pattern PAR(15) : Set Paint PAR(13)
End Proc
Procedure CL_TREE
Shared XTREE,YTREE,SXTREE,SYTREE
Set Pattern 0 : Set Paint 1
If DR$(3)="" or NDR=3
Ink 2,2,1
Bar XTREE-1,YTREE-1 To Screen Width/2-1,TREESY-16
Else
Ink 0,2,2
Bar XTREE-1,YTREE-1 To Screen Width/2-1,TREESY-16
OB_DRAW[DR$(3),XTREE,YTREE]
End If
Set Zone 65,XTREE,YTREE To XTREE+SXTREE-1,YTREE+SYTREE-1
End Proc
Procedure CL_OB
Shared XOB,YOB
Ink 0,2,2 : Set Pattern 0 : Set Paint 1
Bar XOB-1,YOB-1 To Screen Width-1,TREESY-32
End Proc
Procedure OB_DRAW[DR$,XG,YG]
Dim I(4)
If DR$<>""
P=1
Repeat
A$=Mid$(DR$,P,1)
If A$="("
Repeat
Repeat
Inc P
A$=Mid$(DR$,P,1)
Until(A$>="A") and(A$<="Z")
A$=Mid$(DR$,P,2) : Add P,2
Gosub "R_"+A$
Until Mid$(DR$,P,1)=")"
Inc P
Else
Q=Instr(DR$,"(",P) : If Q=0 : Q=Len(DR$)+1 : End If
Text XG+XX,YG+YY+Text Base,Mid$(DR$,P,Q-P)
MX=Max(XX+Text Length(Mid$(DR$,P,Q-P)),MX) : MY=Max(YY+FY,MY)
P=Q
End If
Until P>=Len(DR$)
End If
Pop Proc
'
R_LO:
Gosub R_VAL : XX=V : Inc P : Gosub R_VAL : YY=V
MX=Max(XX,MX) : MY=Max(YY,MY)
Return
R_IN:
Gosub R_VAL : I=V : Inc P : Gosub R_VAL
If I=1
Ink V
Else
If I=2 : Ink ,V
Else
Ink ,,V
End If
End If
Return
'
R_LI:
Gosub R_VAL : X=V : Inc P : Gosub R_VAL : Draw XG+XX,YG+YY To XG+X,YG+V
Goto E_MX
'
R_EL:
Gosub R_VAL : X=V : Inc P : Gosub R_VAL : Ellipse XG+XX,YG+YY,X,V
X=XX+X : V=YY+V
Goto E_MX
'
R_BA:
Gosub R_VAL : X=V : Inc P : Gosub R_VAL : Bar XG+XX,YG+YY To XG+X,YG+V
E_MX: XX=X : YY=V : MX=Max(XX,MX) : MY=Max(YY,MY) : Return
'
R_BO:
Gosub R_VAL
If V<=Length(1)
A=Sprite Base(V)
If A
SX=(Deek(A))*16 : SY=Deek(A+2) : HX=Deek(A+4) : HY=Deek(A+6)
Paste Bob XG+XX+HX,YG+YY+HY,V
X=XX+SX : V=YY+SY
Goto E_MX
End If
End If
Return
'
R_IC:
Gosub R_VAL
If V<=Length(2)
A=Icon Base(V)
If A
SX=(Deek(A))*16 : SY=Deek(A+2)
Paste Icon XG+XX,YG+YY,V
X=XX+SX : V=YY+SY
Goto E_MX
End If
End If
Return
'
R_SF: Gosub R_VAL : Set Font V : FY=Val(Mid$(Font$(V),31)) : Return
R_SS: Gosub R_VAL : Set Text V : Return
R_PA: Gosub R_VAL : Set Pattern V : Return
R_OU: Gosub R_VAL : Set Paint V : Return
R_VAL:
A=Instr(DR$,",",P) : If A=0 : A=1000 : End If
B=Instr(DR$,":",P) : If B=0 : B=1000 : End If
C=Instr(DR$,")",P) : If C=0 : C=1000 : End If
Q=Min(A,Min(B,C)) : V=Val(Mid$(DR$,P,Q-P)) : P=Q
Return
End Proc
Procedure ZERO_COORD
If NCUR>=0
A$=Left$(LCUR$,Len(LCUR$)-1)+"A"
IT_SEARCH[A$,0]
While Param>=0
M$=Mid$(MN$(Param),1)
Mid$(M$,X_DF)=Space$(8)
MN$(Param)=M$
Right$(A$,1)=Chr$(Asc(Right$(A$,1))+1)
IT_SEARCH[A$,Param+1]
Wend
End If
End Proc
Procedure MN_FLAGS[N]
If N>=0
A$=Mid$(MN$(N),1)
If Len(A$)>2
For P=0 To 4
Mid$(A$,D_DF+P,1)=Str$(PAR(P+5))-" "
Next
MN$(N)=A$
End If
End If
End Proc
Procedure MK_EMPTY
A$=Mid$(MN_EMPTY$,1)
For P=0 To 4
Mid$(A$,D_DF+P,1)=Str$(PAR(P+5))-" "
Next
MN_EMPTY$=A$
End Proc
Procedure IT_EMPTY
A$=Chr$(127)
For N=0 To MXMN
If MN$(N)=A$ : F=N : Exit : End If
Next
End Proc[F]
Procedure IT_SEARCH[A$,S]
FL=-1
L=Len(A$)
For N=S To MXMN
If A$=Left$(MN$(N),L) : FL=N : Exit : End If
Next
End Proc[FL]
Procedure MN_RENUM
Dim D(4)
For N=0 To MXMN
Exit If Len(MN$(N))<2
For D=0 To 3
Exit If Mid$(MN$(N),D+1,1)<"A"
Next
Dec D
If D<=OLDD : Inc D(D) : End If
If D>OLDD : D(D)=1 : End If
For P=0 To D
Poke Varptr(MN$(N))+P,64+D(P)
Next
If D<3
For P=D+1 To 3
Poke Varptr(MN$(N))+P,32
Next
End If
OLDD=D
Next
End Proc
Procedure ACT_ITEM[N,I]
If N>=NFIRST and N<=NLAST
X1=Val("$"+Mid$(MN$(N),Z_DF,2))*2
Y1=Val("$"+Mid$(MN$(N),Z_DF+2,2))
X2=Val("$"+Mid$(MN$(N),Z_DF+4,2))*2+1
Y2=Val("$"+Mid$(MN$(N),Z_DF+6,2))
A$=Mid$(MN$(N),Z_DF+8,7)
If I
Ink 1,1,1 : Bar X1-1,Y1-2 To X2,Y2
Ink 0,1
Else
Ink 0,0,0 : Bar X1-1,Y1-2 To X2,Y2
Ink 1,0
End If
Text X1,Y1+6,A$
Ink 1 : Box X1-1,Y1-2 To X2,Y2
End If
For P=0 To 4
PAR(5+P)=Val(Mid$(MN$(N),D_DF+P,1))
Next
End Proc
Procedure TREE
Dim D(4)
Screen 1
If MCHG<0
Cls 0,17,0 To 320,TREESY
End If
If MCHG
Sort MN$(0)
If MN$(0)=Chr$(127) : MN$(0)=Mid$(MN_EMPTY$,1) : CUR$=Left$(MN$(0),4) : End If
Change Mouse 3
Dim Y(5)
Y1=YTREE
OLDD=1 : NFIRST=MXMN : NLAST=0
Ink 1,0
Reset Zone
X=Free
For N=0 To MXMN
Exit If MN$(N)=Chr$(127)
A$=""
For D=0 To 3
DD=Asc(Mid$(MN$(N),D+1,1))-64
Exit If DD<0
A$=A$+Str$(DD)-" "+"."
Next
X1=-6*8+72*D
For E=D+1 To 3 : Y(E)=0 : Next
If D>OLDD
D(D)=1
Ink 1 : Draw X2,Y1+4 To X1,Y1+4
End If
If D<OLDD
Add Y1,2*10
If Y(D)
Ink 1 : Draw X1+28,Y(D) To X1+28,Y1-2
Exit If D=1 and Y1>TREESY
End If
End If
If D=OLDD
Add Y1,10 : Inc D(D)
End If
D$=Space$(7)
L=Len(A$)-1
If L>7 : A$=Right$(A$,7) : L=7 : End If
Mid$(D$,4-L/2,L)=A$
X2=X1+7*8+1 : Y2=Y1+8
OLDD=D : Y(D)=Y2 : OX2=X2
If Y1>=0 and Y2<=TREESY
Set Zone N+1,X1,Y1 To X2,Y2
End If
If Y1>-12 and Y1<TREESY+12
If CUR$<>Left$(MN$(N),4)
Ink 1,0
Box X1-1,Y1-2 To X2,Y2
Else
SET_CUR[N]
Ink 1,1,1 : Bar X1-1,Y1-2 To X2,Y2
Ink 0,1
End If
Text X1,Y1+6,D$
A$=MN$(N)
Mid$(A$,Z_DF,8)=(Hex$(X1/2,2)+Hex$(Y1,2)+Hex$(X2/2,2)+Hex$(Y2,2))-"$"
Mid$(A$,Z_DF+8,7)=D$
MN$(N)=A$
NFIRST=Min(N,NFIRST)
NLAST=Max(N,NLAST)
End If
Next
While MN$(N)<>Chr$(127)
Inc N
Wend
NTOTAL=N
Ink 1,0
ARROW[8,0,8,-30,4,MXMN+1]
ARROW[8,32,8,-16,4,MXMN+2]
Set Slider 1,0,1,8,1,0,1,1
If NLAST
Vslider 0,48 To 16,TREESY-49,NTOTAL,NFIRST,NLAST-NFIRST
Else
Vslider 0,48 To 16,TREESY-49,10,0,10
End If
ARROW[8,TREESY-49,8,14,4,MXMN+3]
ARROW[8,TREESY-49+16,8,32,4,MXMN+4]
Change Mouse 1
MCHG=0
End If
End Proc[FLAG]
Procedure SET_CUR[N]
CUR$="" : LCUR$=""
If Left$(MN$(N),1)<>Chr$(127)
NCUR=N : CUR$=Left$(MN$(N),4)
For P=1 To 4
If Len(CUR$)>=P
If Mid$(CUR$,P,1)>="A"
LCUR$=LCUR$+Mid$(CUR$,P,1)
End If
End If
Next
End If
End Proc
Procedure TRY_MENU
Shared SCCOL
If SCCOL
Change Mouse 3
Screen 2 : Screen To Front 2 : Cls 0
Screen Display 2,,YHI,,
SET_MN
Menu On
Change Mouse 1
While Mouse Key : Wend
UNSET_MN
Menu Del
Screen Display 2,,-Screen Height,,
End If
End Proc
Procedure TRY_MENU2
Change Mouse 3
Screen 2
SET_MN
Menu On
Change Mouse 1
While Mouse Key : Wend
UNSET_MN
Menu Del
End Proc
Procedure SET_MN
X=Free
Screen 2
If Screen Colour>2
Ink 1,2 : Paper 1 : Pen 2
Else
Ink 0,1 : Paper 0 : Pen 2
End If
For N=0 To MXMN
Exit If Left$(MN$(N),1)=Chr$(127)
SET_MN_ITEM[MN$(N),1]
Next
End Proc
Procedure UNSET_MN
Dim D(4)
For NN=0 To MXMN
Exit If MN$(NN)=Chr$(127)
M$=Left$(MN$(NN),15)
For ND=0 To 3
Exit If Mid$(M$,ND+1,1)<"A"
D(ND)=Asc(Mid$(M$,ND+1,2))-64
Next
If ND=1 : X=X Menu(D(0)) : Y=Y Menu(D(0)) : End If
If ND=2 : X=X Menu(D(0),D(1)) : Y=Y Menu(D(0),D(1)) : End If
If ND=3 : X=X Menu(D(0),D(1),D(2)) : Y=Y Menu(D(0),D(1),D(2)) : End If
If ND=4 : X=X Menu(D(0),D(1),D(2),D(3)) : Y=Y Menu(D(0),D(1),D(2),D(3)) : End If
If X>32767 : X=X-65536 : End If
If Y>32767 : Y=Y-65536 : End If
Mid$(M$,X_DF,4)=(Str$(X)-" ")+" " : Mid$(M$,Y_DF,4)=(Str$(Y)-" ")+" "
MN$(NN)=M$+Mid$(MN$(NN),16)
Next
End Proc
Procedure SET_MN_ITEM[M$,FLG]
Dim D(4),D$(4)
For ND=0 To 3
Exit If Mid$(M$,ND+1,1)<"A"
D(ND)=Asc(Mid$(M$,ND+1,2))-64
Next
If ND
GO$="R"+Str$(ND)-" "
P=A_DF
For N=0 To 3
Q=Instr(M$,Chr$(0),P) : D$(N)=Mid$(M$,P,Q-P) : P=Q+1
Next
X=-1000
If FLG
If Mid$(M$,X_DF,1)>" "
X=Val(Mid$(M$,X_DF,4))
Y=Val(Mid$(M$,Y_DF,4))
End If
End If
AC$="A"+Mid$(M$,D_DF,1)
LL$="L"+Mid$(M$,D_DF+1,1)
MV$="M"+Mid$(M$,D_DF+2,1)
IM$="I"+Mid$(M$,D_DF+3,1)
SP$="S"+Mid$(M$,D_DF+4,1)
Gosub GO$
Gosub GO$+AC$
Gosub GO$+LL$
Gosub GO$+MV$
Gosub GO$+IM$
Gosub GO$+SP$
If X<>-1000
If VERSION=101 : Swap X,Y : End If
Gosub GO$+"XY"
End If
End If
Pop Proc
'
R1: Menu$(D(0))=D$(0),D$(1),D$(2),D$(3) : Return
R2: Menu$(D(0),D(1))=D$(0),D$(1),D$(2),D$(3) : Return
R3: Menu$(D(0),D(1),D(2))=D$(0),D$(1),D$(2),D$(3) : Return
R4: Menu$(D(0),D(1),D(2),D(3))=D$(0),D$(1),D$(2),D$(3) : Return
R1XY: Set Menu(D(0)) To X,Y : Return
R2XY: Set Menu(D(0),D(1)) To X,Y : Return
R3XY: Set Menu(D(0),D(1),D(2)) To X,Y : Return
R4XY: Set Menu(D(0),D(1),D(2),D(3)) To X,Y : Return
R1A0: Menu Inactive(D(0)) : Return
R2A0: Menu Inactive(D(0),D(1)) : Return
R3A0: Menu Inactive(D(0),D(1),D(2)) : Return
R4A0: Menu Inactive(D(0),D(1),D(2),D(3)) : Return
R1A1: Menu Active(D(0)) : Return
R2A1: Menu Active(D(0),D(1)) : Return
R3A1: Menu Active(D(0),D(1),D(2)) : Return
R4A1: Menu Active(D(0),D(1),D(2),D(3)) : Return
R1L0: Menu Tline(D(0)) : Return
R2L0: Menu Tline(D(0),D(1)) : Return
R3L0: Menu Tline(D(0),D(1),D(2)) : Return
R4L0: Menu Tline(D(0),D(1),D(2),D(3)) : Return
R1L1: Menu Line(D(0)) : Return
R2L1: Menu Line(D(0),D(1)) : Return
R3L1: Menu Line(D(0),D(1),D(2)) : Return
R4L1: Menu Line(D(0),D(1),D(2),D(3)) : Return
R1L2: Menu Bar(D(0)) : Return
R2L2: Menu Bar(D(0),D(1)) : Return
R3L2: Menu Bar(D(0),D(1),D(2)) : Return
R4L2: Menu Bar(D(0),D(1),D(2),D(3)) : Return
R1M0: Menu Static(D(0)) : Return
R2M0: Menu Static(D(0),D(1)) : Return
R3M0: Menu Static(D(0),D(1),D(2)) : Return
R4M0: Menu Static(D(0),D(1),D(2),D(3)) : Return
R1M1: Menu Movable(D(0)) : Return
R2M1: Menu Movable(D(0),D(1)) : Return
R3M1: Menu Movable(D(0),D(1),D(2)) : Return
R4M1: Menu Movable(D(0),D(1),D(2),D(3)) : Return
R1I0: Menu Item Static(D(0)) : Return
R2I0: Menu Item Static(D(0),D(1)) : Return
R3I0: Menu Item Static(D(0),D(1),D(2)) : Return
R4I0: Menu Item Static(D(0),D(1),D(2),D(3)) : Return
R1I1: Menu Item Movable(D(0)) : Return
R2I1: Menu Item Movable(D(0),D(1)) : Return
R3I1: Menu Item Movable(D(0),D(1),D(2)) : Return
R4I1: Menu Item Movable(D(0),D(1),D(2),D(3)) : Return
R1S0: Menu Link(D(0)) : Return
R2S0: Menu Link(D(0),D(1)) : Return
R3S0: Menu Link(D(0),D(1),D(2)) : Return
R4S0: Menu Link(D(0),D(1),D(2),D(3)) : Return
R1S1: Menu Separate(D(0)) : Return
R2S1: Menu Separate(D(0),D(1)) : Return
R3S1: Menu Separate(D(0),D(1),D(2)) : Return
R4S1: Menu Separate(D(0),D(1),D(2),D(3)) : Return
End Proc
Procedure ALERT[A$,B$,C$]
Screen 0
Paper 1 : Pen 2 : Wind Open 1,0,0,78,8,2 : Curs Off
Centre A$ : Print : Centre B$ : Print : Centre C$ : Print
Print : Print : Centre ">>> Press mousekey to go on <<<"
While Mouse Key : Wend
Repeat : Until Mouse Key
Wind Close
End Proc
Procedure ARROW[X,Y,SX,SY,S,ZON]
D=Sgn(SY) : SY=Abs(SY)
Box X-SX,Y To X+SX,Y+SY
For N=0 To S
If D>0
Polyline X-SX+1,Y+1 To X,Y+SY-N-1 To X+SX-1,Y
Else
Polyline X-SX+1,Y+SY-1 To X,Y+N+1 To X+SX,Y+SY-1
End If
Next
Set Zone ZON,X-SX,Y To X+SX,Y+SY
End Proc
Procedure CASE[X,Y,SX,SY,S,ZON]
Set Paint 0
Ink 2 : Set Paint 3
For N=0 To S-1
Box X-SX+N,Y-SY+N To X+SX-N,Y+SY-N
Next
Set Zone ZON,X-SX,Y-SY To X+SX,Y+SY
End Proc
' The graphic menu page definitions!
'
'---> Title page
L1_1: Data "C,Y1,E,LMn_Title: AMOS Menu editor "
L1_2: Data "X72,Y6,E,LMn_Abort: Quit "
L1_3: Data "X02,Y4,E,LMn_New_It: Create a new menu "
L1_4: Data "X02,Y6,E,LMn_Load: Load a menu "
L1_5: Data "X24,Y4,E,LMn_EditIt: Edit current menu "
L1_6: Data "X24,Y6,E,LMn_Save: Save current menu "
L1_7: Data "X46,Y4,E,LMn_Bank: Save menu bank "
L1_8: Data "X46,Y6,E,LMn_GBnk: Quit & grab bank "
'
'---> Screen creation page
L2_1: Data "C,Y0: NEW MENU - Default screen creation "
L2_2: Data "X66,Y6,E,LMn_SaveIt: Prev. menu "
L2_3: Data "X66,Y4,E,LNw_Go: Edit it! "
L2_4: Data "X0,Y2:- Number of colours:"
L2_5: Data "X30,Y2,E,R1,V2: 2 |E,R1,V4: 4 |E,R1,V8: 8 |E,R1,V16: 16 |E,R1,V32: 32 |E,R1,V64: 64 "
L2_6: Data "X0,Y4:- Resolution mode:"
L2_7: Data "X30,Y4,E,R2,V0: Lowres |E,R2,V$8000: Hires "
'
'---> Edit page
L3_1: Data "X2,Y0:Item status:|X24,Y0:Tree editor:|X52,Y0:Draw menu:"
L3_2: Data "X2,Y2,E,LIt_Act,T5/2/0/1:&T/ Inact. / Active /"
L3_3: Data "X11,Y4,E,LIt_Lnk,T9/2/0/1:&T/ Linked / Separ. /"
L3_4: Data "X2,Y4,E,LIt_Lne,T6/3/0/1/2:&T/ T.line / Line / Bar /"
L3_5: Data "X2,Y6,E,LIt_Mve,T7/2/0/1:&T/ Br.sta / Br.mov /"
L3_6: Data "X11,Y6,E,LIt_Imv,T8/2/0/1:&T/ It.sta / It.mov /"
L3_7: Data "X24,Y2,E,LIt_Add: Add item |E,LIt_Ins: Ins item "
L3_8: Data "X24,Y4,E,LCr_Bra: Branch |E,LIt_Del: Delete "
L3_9: Data "X24,Y6,E,LEr_Pos: Reset menu position "
L3_10: Data "X52,Y2,E,V0,LMn_DrawIt: Normal "
L3_11: Data "X65,Y2,E,V1,LMn_DrawIt: Highlight "
L3_12: Data "X52,Y4,E,V2,LMn_DrawIt: Inactive "
L3_13: Data "X65,Y4,E,V3,LMn_DrawIt: Background "
L3_14: Data "X65,Y6,E,V4,LMn_SaveIt: Prev. menu "
'
'---> Draw page
L4_1: Data "X2,Y0:Draw functions:|X32:Settings:|X43:Object:|X58:Misc:"
L4_2: Data "X2,Y2,E,LDr_Line: Line |E,LDr_Box: Box |E,LDr_Bar: Bar |E,LDr_Ell: Ellipse "
L4_3: Data "X2,Y4,E,LDr_Ico: Icon |E,LDr_Bob: Bob |E,LDr_Text: Text |E,LSt_TLen: T. len "
L4_4: Data "X2,Y6,E,LMk_Inv: Make inverse |E,LMk_Bor: Make border "
L4_5: Data "X32,Y2,E,JT_Set,T10/2/0/1:&T/N/U/"
L4_6: Data "X34,Y2,E,JT_Set,T11/2/0/1:&T/N/B/"
L4_7: Data "X36,Y2,E,JT_Set,T12/2/0/1:&T/N/I/"
L4_8: Data "X38,Y2,E,LSt_Patm:-"
L4_9: Data "X40,Y2,E,LSt_Patp:+"
L4_10: Data "X32,Y4,E,JT_Set,T13/2/0/1:&T/ Not out / Outline /"
L4_11: Data "X32,Y6,E,LSt_Font: S. Font "
L4_12: Data "X43,Y2,E,JG_Drob,V20,>0,<20,+1:&-|:&V3|E:&+"
L4_13: Data "X43,Y4,E,LOb_Ins: Ins |E,LOb_Del: Del "
L4_14: Data "X43,Y6,E,LOb_Pus: Push |E,LOb_Pas: Past "
L4_15: Data "X58,Y4,E,LLd_Bank: Load a memory bank "
L4_16: Data "X58,Y2,E,LTr_Pus:Push item|E,LTr_Pas:Paste item"
L4_17: Data "X58,Y6,E,LBTo_Edit: Previous menu "
'
'---> Font menu
L5_1: Data "C,Y1:Please choose a font:|X66,Y1,LMn_Back: Prev. Menu "
L5_2: Data "X2,Y2,V1,LCh_Font:&S"
L5_3: Data "X21,Y2,V2,LCh_Font:&S"
L5_4: Data "X40,Y2,V3,LCh_Font:&S"
L5_5: Data "X59,Y2,V4,LCh_Font:&S"
L5_6: Data "X2,Y3,V5,LCh_Font:&S"
L5_7: Data "X21,Y3,V6,LCh_Font:&S"
L5_8: Data "X40,Y3,V7,LCh_Font:&S"
L5_9: Data "X59,Y3,V8,LCh_Font:&S"
L5_10: Data "X2,Y4,V9,LCh_Font:&S"
L5_11: Data "X21,Y4,V10,LCh_Font:&S"
L5_12: Data "X40,Y4,V11,LCh_Font:&S"
L5_13: Data "X59,Y4,V12,LCh_Font:&S"
L5_14: Data "X2,Y5,V13,LCh_Font:&S"
L5_15: Data "X21,Y5,V14,LCh_Font:&S"
L5_16: Data "X40,Y5,V15,LCh_Font:&S"
L5_17: Data "X59,Y5,V16,LCh_Font:&S"
L5_18: Data "X2,Y6,V17,LCh_Font:&S"
L5_19: Data "X21,Y6,V18,LCh_Font:&S"
L5_20: Data "X40,Y6,V19,LCh_Font:&S"
L5_21: Data "X59,Y6,V20,LCh_Font:&S"